package apuesta.service;

import java.util.Date;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.StatelessSession;
import org.hibernate.Transaction;

import com.google.gson.Gson;

import apuesta.dto.ApuestaDto;
import apuesta.dto.ApuestaDto2;
import apuesta.dto.DisciplinaDto2;
import apuesta.dto.EquipoDto;
import apuesta.dto.EquipoDto2;
import apuesta.dto.EventoDto;
import apuesta.dto.EventoDto2;
import apuesta.hibernate.HibernateFactoryApuesta;

public class EventoService {
	
	public static boolean registrarEvento(EventoDto evento){
		boolean res = true;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		try{
			Transaction tx = sesion.beginTransaction();
			sesion.persist(evento);
			tx.commit();
		}catch(Exception ex){
			System.err.println("no se pudo ejecutar la insercion: "+ex);
			res = false;
		}finally{
			sesion.close();
		}
		return res;
	}

	public static List<EventoDto> listarEventosModificables() {
		List<EventoDto> eventos = null;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		try{
			Query query = sesion.getNamedQuery("query_eventosModificables");
			eventos = (List<EventoDto>)query.list();
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			sesion.close();
		}
		return eventos;
	}

	public static EventoDto buscar(int id_evento) {
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		EventoDto evento = null;
		try{
			evento = (EventoDto)sesion.get(EventoDto.class, id_evento);
			System.out.println("size apuestas: "+evento.getApuestas().size());
		}catch(Exception ex){
			System.err.println("no se encontro el evento: "+ex);
		}finally{
			sesion.close();
		}
		return evento;
	}

	public static boolean actualizarEvento(EventoDto evento) {
		boolean res = true;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		try{
			Transaction tx = sesion.beginTransaction();
			sesion.update(evento);
			tx.commit();
		}catch(HibernateException ex){
			System.err.println("no se pudo actualizar: "+ex);
			res = false;
		}finally{
			sesion.close();
		}
		return res;
	}

	public static boolean eliminar(EventoDto evento) {
		boolean res = true;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		try{
			Transaction tx = sesion.beginTransaction();
			sesion.delete(evento);
			tx.commit();
		}catch(HibernateException ex){
			System.err.println("no se pudo eliminar: "+ex);
			res = false;
		}finally{
			sesion.close();
		}
		return res;
	}
	
	public static List<EventoDto> listarEventosPendientes() {
		List<EventoDto> eventos = null;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			Query query = sesion.getNamedQuery("query_eventosPendientes");
			eventos = (List<EventoDto>)query.list();
			sesion.flush();
			sesion.clear();
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return eventos;
	}

	public static List<EventoDto2> listarEventosEnCurso() {
		List<EventoDto2> eventos = null;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			Query query = sesion.createSQLQuery("select * from t_evento where Id_EstadoEvento = 4").addEntity("EventoDto2", EventoDto2.class);
			eventos = query.list();
			
			for (EventoDto2 ev : eventos) {
				query = sesion.createSQLQuery("select * from t_equipo where id_Equipo = "+ev.getId_equipoLocal()).addEntity("EquipoDto2", EquipoDto2.class);
				ev.setEquipoLocal((EquipoDto2)query.uniqueResult());
				query = sesion.createSQLQuery("select * from t_equipo where id_Equipo = "+ev.getId_equipoVisitante()).addEntity("EquipoDto2", EquipoDto2.class);
				ev.setEquipoVisitante((EquipoDto2)query.uniqueResult());
				query = sesion.createSQLQuery("select * from t_disciplina where Id_Disciplina = "+ev.getId_disciplina()).addEntity("DisciplinaDto2", DisciplinaDto2.class);
				ev.setDisciplina((DisciplinaDto2)query.uniqueResult());
				sesion.flush();
				sesion.clear();
			}
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return eventos;
	}

	public static List<EventoDto2> listarEventosAprobados() {
		List<EventoDto2> eventos = null;
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			Query query = sesion.getNamedQuery("query_eventosAprobados");
			eventos = (List<EventoDto2>)query.list();
			sesion.flush();
			sesion.clear();
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return eventos;
	}

	public static String jsonEventosAprobados(String desde, String hasta) {
		List<EventoDto2> eventos = null;
		//StatelessSession sesion = HibernateFactoryApuesta.getSessionFactory().openStatelessSession();
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		String e = "";
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = null;
			if(desde != "" && hasta != ""){
				query = sesion.createSQLQuery("select * from t_evento where id_EstadoEvento = 2 and Fecha_Evento between '"+desde+"' and '"+hasta+"' order by Fecha_Evento desc").addEntity("EventoDto2", EventoDto2.class);
			}else if(desde != "" ){
				query = sesion.createSQLQuery("select * from t_evento where id_EstadoEvento = 2 and Fecha_Evento > '"+desde+"' order by Fecha_Evento desc").addEntity("EventoDto2", EventoDto2.class);
			}else if(hasta != "" ){
				query = sesion.createSQLQuery("select * from t_evento where id_EstadoEvento = 2 and Fecha_Evento < '"+hasta+"' order by Fecha_Evento desc").addEntity("EventoDto2", EventoDto2.class);
			}else{
				query = sesion.createSQLQuery("select * from t_evento where id_EstadoEvento = 2 order by Fecha_Evento desc").addEntity("EventoDto2", EventoDto2.class);
			}
			
			eventos = query.list();
			for (EventoDto2 ev : eventos) {
				query = sesion.createSQLQuery("select * from t_equipo where id_Equipo = "+ev.getId_equipoLocal()).addEntity("EquipoDto2", EquipoDto2.class);
				ev.setEquipoLocal((EquipoDto2)query.uniqueResult());
				query = sesion.createSQLQuery("select * from t_equipo where id_Equipo = "+ev.getId_equipoVisitante()).addEntity("EquipoDto2", EquipoDto2.class);
				ev.setEquipoVisitante((EquipoDto2)query.uniqueResult());
				query = sesion.createSQLQuery("select * from t_apuesta where id_Evento = "+ev.getId_evento()).addEntity("ApuestaDto2", ApuestaDto2.class);
				ev.setApuestas(query.list());
				
				sesion.flush();
				sesion.clear();
			}
			
			//List<ApuestaDto> apuestas  = eventos.get(0).getApuestas();
			System.out.println("termino la lista");
			System.out.println("size: "+eventos.size());
			
			Gson g = new Gson();
			e = g.toJson(eventos);
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		
		return e;
	}

	public static void actualizarPozo(int id_evento, String monto) {
		// TODO Auto-generated method stub
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			//Query query = sesion.getNamedQuery("query_eventosAprobados");
			Query query = sesion.createSQLQuery("update t_evento set Pozo_Evento = Pozo_Evento+"+monto+" where Id_Evento = "+id_evento);
			query.executeUpdate();
			sesion.flush();
			sesion.clear();
			
		}catch(Exception ex){
			System.err.println("no se pudo traer la lista: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
	}
	
	public static void actualizarEstado(int id_evento, int id_estadoEvento) {
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		try{
			Query query = sesion.createSQLQuery("update t_evento set Id_EstadoEvento = "+id_estadoEvento+" where Id_Evento = "+id_evento);
			query.executeUpdate();
		}catch(HibernateException ex){
			System.err.println("no se pudo actualizar: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
	}
	
	public static EventoDto2 buscar2(int id_evento) {
		Session sesion = HibernateFactoryApuesta.getSessionFactory().openSession();
		Transaction tx = sesion.beginTransaction();
		EventoDto2 e = null;
		try{
			Query query = sesion.createSQLQuery("select * from t_evento where Id_Evento = "+id_evento).addEntity("EventoDto2", EventoDto2.class);
			e = (EventoDto2) query.uniqueResult();
		}catch(HibernateException ex){
			System.err.println("no se pudo actualizar: "+ex);
		}finally{
			tx.commit();
			sesion.close();
		}
		return e;
	}
	
}
